home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / bbs_util / bsrc_260.zip / SRC.ZIP / SENDBARK.C < prev    next >
C/C++ Source or Header  |  1996-02-20  |  9KB  |  366 lines

  1. /*--------------------------------------------------------------------------*/
  2. /*                                                                          */
  3. /*                                                                          */
  4. /*      ------------         Bit-Bucket Software, Co.                       */
  5. /*      \ 10001101 /         Writers and Distributors of                    */
  6. /*       \ 011110 /          Freely Available<tm> Software.                 */
  7. /*        \ 1011 /                                                          */
  8. /*         ------                                                           */
  9. /*                                                                          */
  10. /*              (C) Copyright 1987-96, Bit Bucket Software Co.              */
  11. /*                                                                          */
  12. /*                 This module was written by Bob Hartman                   */
  13. /*                                                                          */
  14. /*                BinkleyTerm SEAdog Mail Session Routines                  */
  15. /*                                                                          */
  16. /*                                                                          */
  17. /*    For complete  details  of the licensing restrictions, please refer    */
  18. /*    to the License  agreement,  which  is published in its entirety in    */
  19. /*    the MAKEFILE and BT.C, and also contained in the file LICENSE.260.    */
  20. /*                                                                          */
  21. /*    USE  OF THIS FILE IS SUBJECT TO THE  RESTRICTIONS CONTAINED IN THE    */
  22. /*    BINKLEYTERM  LICENSING  AGREEMENT.  IF YOU DO NOT FIND THE TEXT OF    */
  23. /*    THIS  AGREEMENT IN ANY OF THE  AFOREMENTIONED FILES,  OR IF YOU DO    */
  24. /*    NOT HAVE THESE FILES,  YOU  SHOULD  IMMEDIATELY CONTACT BIT BUCKET    */
  25. /*    SOFTWARE CO.  AT ONE OF THE  ADDRESSES  LISTED BELOW.  IN NO EVENT    */
  26. /*    SHOULD YOU  PROCEED TO USE THIS FILE  WITHOUT HAVING  ACCEPTED THE    */
  27. /*    TERMS  OF  THE  BINKLEYTERM  LICENSING  AGREEMENT,  OR  SUCH OTHER    */
  28. /*    AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO.      */
  29. /*                                                                          */
  30. /*                                                                          */
  31. /* You can contact Bit Bucket Software Co. at any one of the following      */
  32. /* addresses:                                                               */
  33. /*                                                                          */
  34. /* Bit Bucket Software Co.        FidoNet  1:104/501, 1:343/491             */
  35. /* P.O. Box 460398                AlterNet 7:42/1491                        */
  36. /* Aurora, CO 80046               BBS-Net  86:2030/1                        */
  37. /*                                Internet f491.n343.z1.fidonet.org         */
  38. /*                                                                          */
  39. /* Please feel free to contact us at any time to share your comments about  */
  40. /* our software and/or licensing policies.                                  */
  41. /*                                                                          */
  42. /*--------------------------------------------------------------------------*/
  43.  
  44. /* Include this file before any other includes or defines! */
  45.  
  46. #include "includes.h"
  47.  
  48. #define rb_plus "rb+"
  49.  
  50. void 
  51. SEA_sendreq ()
  52. {
  53.     char fname[80];
  54.     char reqf[80];
  55.     char *reqtime = " 0";
  56.     char *p, *name, *pw;
  57.     char *updtime;
  58.     FILE *fp;
  59.     char *HoldName;
  60.     ADDR tmp;
  61.  
  62.     HoldName = HoldAreaNameMunge (&called_addr);
  63.  
  64.     tmp = called_addr;
  65.  
  66.     /* For a point, massage the address to get the right .REQ filename */
  67.  
  68.     if (tmp.Point != 0)
  69.     {
  70.         tmp.Node = tmp.Point;
  71.         tmp.Point = 0;
  72.         tmp.Net = (pvtnet > 0) ? (unsigned int) pvtnet : 0;
  73.     }
  74.  
  75.     (void) sprintf (fname,
  76.         "%s%s.REQ",
  77.         HoldName, Hex_Addr_Str (&tmp));
  78.  
  79.     /* If we have file requests, then do them */
  80.     if (!dexists (fname))
  81.     {
  82.         status_line (MSG_TXT (M_NO_OUT_REQUESTS));
  83.     }
  84.     else
  85.     {
  86.         status_line (MSG_TXT (M_OUT_REQUESTS));
  87.         /* Open the .REQ file */
  88.         if ((fp = fopen (fname, read_ascii)) == NULL)
  89.         {
  90.             (void) Bark_Request (CURRENT.sc_Inbound, NULL, NULL, NULL);
  91.             return;
  92.         }
  93.  
  94.         /* As long as we do not have EOF, read the request */
  95.         while ((fgets (reqf, 79, fp) != NULL) && (CARRIER))
  96.         {
  97.             /* Properly format the request */
  98.  
  99.             /* First get rid of the trailing junk */
  100.  
  101.             p = reqf + strlen (reqf) - 1;
  102.             while ((p >= reqf) && (isspace (*p)))
  103.                 *p-- = '\0';
  104.  
  105.             /* Now get rid of the beginning junk */
  106.  
  107.             p = reqf;
  108.             while ((*p) && (isspace (*p)))
  109.                 p++;
  110.  
  111.             /* This is where the name starts */
  112.             name = p;
  113.  
  114.             /* If the first char is ; then ignore the line */
  115.             if (*name == ';')
  116.                 continue;
  117.  
  118.             /* Now get to where the name ends */
  119.             while ((*p) && (!isspace (*p)))
  120.                 p++;
  121.  
  122.             updtime = reqtime;    /* Default to request        */
  123.             pw = p;                /* This is or will be a null */
  124.  
  125. req_scan:
  126.  
  127.             if (*p)
  128.             {
  129.                 *p++ = '\0';
  130.  
  131.                 while ((*p) && (*p != '!') && (*p != '-') && (*p != '+'))
  132.                     p++;
  133.  
  134.                 /* Check for a password */
  135.  
  136.                 if (*p == '!')
  137.                 {
  138.                     *p = ' ';
  139.                     pw = p++;
  140.  
  141.                     /* Now get to where the password ends */
  142.  
  143.                     while ((*p) && (!isspace (*p)))
  144.                         p++;
  145.                     goto req_scan;
  146.                 }
  147.  
  148.                 /* Try for an update request */
  149.  
  150.                 if (*p == '+')
  151.                 {
  152.                     *p = ' ';
  153.                     updtime = p++;
  154.  
  155.                     /* Now get to where the update time ends */
  156.  
  157.                     while ((*p) && (!isspace (*p)))
  158.                         p++;
  159.  
  160.                     *p = '\0';
  161.  
  162.                     /* Request time is last thing we care about on line, so
  163.                   we just drop out of the loop after finding it.
  164.                 */
  165.                 }
  166.  
  167.                 /* Note: since SEAdog doesn't do "backdate" requests, all we
  168.                have to do if we see a '-' is to do a full request. Hence
  169.                we only process a '+' here.
  170.              */
  171.  
  172.             }
  173.  
  174.             if (Bark_Request (CURRENT.sc_Inbound, name, pw, updtime))
  175.                 continue;
  176.         }
  177.         (void) fclose (fp);
  178.         (void) unlink (fname);
  179.         status_line (MSG_TXT (M_END_OUT_REQUESTS));
  180.     }
  181.  
  182.     /* Finish the file requests off */
  183.     (void) Bark_Request (CURRENT.sc_Inbound, NULL, NULL, NULL);
  184.  
  185. }
  186.  
  187. int SBInit (BARKARGSP);
  188. int SBEnd (BARKARGSP);
  189. int SBSendBark (BARKARGSP);
  190. int SBAskFile (BARKARGSP);
  191. int SBRcvFile (BARKARGSP);
  192. int SBNxtFile (BARKARGSP);
  193.  
  194. typedef struct
  195. {
  196.     char *state_name;
  197.     int (*state_func) (BARKARGSP);
  198. } SSTATES, *SSTATEP;
  199.  
  200. SSTATES Bark_Sender[] =
  201. {
  202.     {"SBInit", SBInit},
  203.     {"SBEnd", SBEnd},
  204.     {"SB0", SBSendBark},
  205.     {"SB1", SBAskFile},
  206.     {"SB2", SBRcvFile},
  207.     {"SB3", SBNxtFile},
  208. };
  209.  
  210. void 
  211. Build_Bark_Packet (BARKARGSP args)
  212. {
  213.     char *p, *q;
  214.     word crc;
  215.  
  216.     p = args->barkpacket;
  217.     *p++ = ACK;
  218.     crc = 0;
  219.     q = args->filename;
  220.     while (*q)
  221.     {
  222.         *p++ = *q;
  223.         crc = xcrc (crc, (byte) (*q));
  224.         ++q;
  225.     }
  226.     q = args->barktime;
  227.     while (*q)
  228.     {
  229.         *p++ = *q;
  230.         crc = xcrc (crc, (byte) (*q));
  231.         ++q;
  232.     }
  233.     q = args->barkpw;
  234.     while (*q)
  235.     {
  236.         *p++ = *q;
  237.         crc = xcrc (crc, (byte) (*q));
  238.         ++q;
  239.     }
  240.  
  241.     *p++ = ETX;
  242.     *p++ = (char) (crc & 0xff);
  243.     *p++ = (char) (crc >> 8);
  244.  
  245.     args->barklen = (int) (p - args->barkpacket);
  246. }
  247.  
  248. int 
  249. SBInit (BARKARGSP args)
  250. {
  251.     XON_DISABLE ();
  252.     happy_compiler = args->tries;    /* Makes the compiler happy! */
  253.     return ((int) args->control);
  254. }
  255.  
  256. int 
  257. SBEnd (BARKARGSP args)
  258. {
  259.     happy_compiler = args->tries;    /* Makes the compiler happy! */
  260.     return ((int) args->control);
  261. }
  262.  
  263. int 
  264. SBSendBark (BARKARGSP args)
  265. {
  266.     if ((args->filename != NULL) && (args->filename[0] != '\0'))
  267.     {
  268.         status_line ("%s '%s' %s%s", MSG_TXT (M_MAKING_FREQ), args->filename, (*(args->barkpw)) ? "with password" : "", args->barkpw);
  269.         args->tries = 0;
  270.         Build_Bark_Packet (args);
  271.         return (SB1);
  272.     }
  273.     else
  274.     {
  275.         SENDBYTE (ETB);
  276.  
  277.         /* Delay one second */
  278.         big_pause (1);
  279.  
  280.         return (SUCCESS);
  281.     }
  282. }
  283.  
  284. int 
  285. SBAskFile (BARKARGSP args)
  286. {
  287.     SENDCHARS (args->barkpacket, args->barklen, 1);
  288.     return (SB2);
  289. }
  290.  
  291. int 
  292. SBRcvFile (BARKARGSP args)
  293. {
  294.     int c;
  295.     int ret;
  296.  
  297.     ret = SB2;
  298.     while (CARRIER && (ret == SB2))
  299.     {
  300.         c = TIMED_READ (10);
  301.  
  302.         if (c == ACK)
  303.         {
  304.             (void) Batch_Receive (args->inbound);
  305.             ret = SB3;
  306.             break;
  307.         }
  308.  
  309.         if (args->tries > 5)
  310.         {
  311.             /* Report transfer failed */
  312.             SENDBYTE (ETB);
  313.             ret = SENDBLOCK_ERR;
  314.             break;
  315.         }
  316.  
  317.         CLEAR_INBOUND ();
  318.         ++(args->tries);
  319.         ret = SB1;
  320.     }
  321.  
  322.     if (!CARRIER)
  323.         return (CARRIER_ERR);
  324.     else
  325.         return (ret);
  326. }
  327.  
  328. int 
  329. SBNxtFile (BARKARGSP args)
  330. {
  331.     short c;
  332.     long SB3Timer;
  333.  
  334.     SB3Timer = timerset (4500);
  335.     happy_compiler = args->tries;    /* Makes the compiler happy! */
  336.  
  337.     while (CARRIER && !timeup (SB3Timer))
  338.     {
  339.         if ((unsigned short) (c = TIMED_READ (5)) == 0xffff)
  340.         {
  341.             SENDBYTE (SUB);
  342.             continue;
  343.         }
  344.  
  345.         if (c == ENQ)
  346.             return (SUCCESS);
  347.     }
  348.  
  349.     if (CARRIER)
  350.         return (CARRIER_ERR);
  351.     else
  352.         return (TIME_ERR);
  353. }
  354.  
  355. int 
  356. Bark_Request (char *where, char *filename, char *pw, char *updtime)
  357. {
  358.     BARKARGS bark;
  359.  
  360.     bark.inbound = where;
  361.     bark.filename = filename;
  362.     bark.barkpw = pw;
  363.     bark.barktime = updtime;
  364.     return (state_machine ((STATEP) Bark_Sender, &bark, SB0));
  365. }
  366.